package dwei.astar
{
	import mx.core.IUID;

	/**
	 * A星算法节点VO对象
	 * @author dwei
	 * 
	 */	
	internal class AStarVO implements IUID
	{
//============================================================================
//PROPERTY
//============================================================================
		private var _uid:String;
		private var _parent:AStarVO;
		private var _feeFrom:Number;
		private var _feeTo:Number;
		private var _x:Number;
		private var _y:Number;
//============================================================================
//CONSTRUCTOR
//============================================================================
		public function AStarVO(x:Number, y:Number)
		{
			_feeFrom = _feeTo = 0;
			_x = x;
			_y = y;
			_uid = x + "v" + y;
		}
//============================================================================
//PUBLIC
//============================================================================
		/**
		 * 判断指定节点是否与该节点在同一坐标处
		 * @param unit
		 * @return 
		 */
		public function equal(vo:AStarVO):Boolean
		{
			if (!vo) return false;
			return vo.uid == _uid;
		}
		
		/**
		 * 克隆该节点
		 * @return 
		 */		
		public function clone():AStarVO
		{
			var vo:AStarVO = new AStarVO(_x, _y);
			vo.parent = _parent;
			vo.feeFrom = _feeFrom;
			vo.feeTo = _feeTo;
			return vo;
		}
		
		/**
		 * 判断该节点是否与指定节点相邻
		 * @param unit
		 * @return 如果equal(unit)为true,返回false
		 */		
		public function isNeighbour(vo:AStarVO):Boolean
		{
			if (!vo || equal(vo)) return false;
			var hDis:int = Math.abs(vo.x - x);
			var vDis:int = Math.abs(vo.y - y);
			if (hDis <= 1 && vDis <= 1) return true;
			else return false;
		}
		
		public function toString():String
		{
			var str:String = "标识:" + _uid + 
				",水平位置:" + _x + 
				",垂直位置:" + _y + 
				",起点到该点的代价:" + _feeFrom + 
				",该点到目标点的估计代价:" + _feeTo;
//			str += ",上一级单元块标识:" + _parent?_parent.id:"null";
			return str;
		}
//============================================================================
//GETTER/SETTER
//============================================================================
		
		public function get uid():String
		{
			return _uid;
		}
		
		public function set uid(value:String):void
		{
			_uid = value;
		}

		/**
		 * 父节点
		 */
		public function get parent():AStarVO
		{
			return _parent;
		}

		/**
		 * @private
		 */
		public function set parent(value:AStarVO):void
		{
			_parent = value;
		}

		/**
		 * 起点到该节点的代价
		 */
		public function get feeFrom():Number
		{
			return _feeFrom;
		}

		/**
		 * @private
		 */
		public function set feeFrom(value:Number):void
		{
			_feeFrom = value;
		}

		/**
		 * 该节点到目标节点的估价
		 */
		public function get feeTo():Number
		{
			return _feeTo;
		}

		/**
		 * @private
		 */
		public function set feeTo(value:Number):void
		{
			_feeTo = value;
		}

		/**
		 * 该节点横向块坐标
		 */
		public function get x():Number
		{
			return _x;
		}

		/**
		 * @private
		 */
//		public function set x(value:Number):void
//		{
//			_x = value;
//		}

		/**
		 * 该节点纵向块坐标
		 */
		public function get y():Number
		{
			return _y;
		}

		/**
		 * @private
		 */
//		public function set y(value:Number):void
//		{
//			_y = value;
//		}

		/**
		 * 该单元块目前的总代价
		 */		
		public function get feeTotal():Number
		{
			return feeFrom + feeTo;
		}

	}
}